#include "../logs/wrtlog.h"
#include <unistd.h>
//扩展一个以时间作为文件滚动切换类型的日志落地模块
//实际上是以时间段滚动 实现思想：time(nullptr) % gap
enum class TimeGap{
    GAP_SECOND,
    GAP_MINUTE,
    GAP_HOUR,
    GAP_DAY
};
class RollByTimeSink:public wrtlog::LogSink{
        public:
        //构造时传入文件名 并打开文件 将操作句柄管理起来
        RollByTimeSink(const std::string &basename,TimeGap gap_type)
        :_basename(basename)
        {
            switch (gap_type)
            {
                case TimeGap::GAP_SECOND:_gap_size=1;break;
                case TimeGap::GAP_MINUTE:_gap_size=60;break;
                case TimeGap::GAP_HOUR:_gap_size=3600;break;
                case TimeGap::GAP_DAY:_gap_size=3600*24;break;
            }
            _cur_gap=_gap_size == 1?wrtlog::util::Date::now(): wrtlog::util::Date::now()%_gap_size; //获取当前时间段
            std::string filename=createNewFile();
            wrtlog::util::File::createDirectory(wrtlog::util::File::path(filename));
            _ofs.open(filename,std::ios::binary | std::ios::app);
            assert(_ofs.is_open());
        }
        void log(const char* data,size_t len){
            time_t cur=wrtlog::util::Date::now();
            if((cur%_gap_size) != _cur_gap){
                _ofs.close();
            std::string filename=createNewFile();
            _ofs.open(filename,std::ios::binary | std::ios::app);
            assert(_ofs.is_open());
            }
            _ofs.write(data,len);
            assert(_ofs.good());
        }
        private:
            std::string createNewFile()
            {
            time_t t= wrtlog::util::Date::now();
            struct tm lt;
            localtime_r(&t,&lt);
            std::stringstream  filename; 
            filename << _basename;
            filename << lt.tm_year + 1900;
            filename << lt.tm_mon + 1;
            filename << lt.tm_mday;
            filename << lt.tm_hour;
            filename << lt.tm_min;
            filename << lt.tm_sec;
            filename << ".log";
            return filename.str();
            }
        private:
        std::string _basename;
        std::ofstream _ofs;
        size_t _cur_gap; //当前是第几个时间段
        size_t _gap_size;//时间段大小
    };
int main()
{
    std::unique_ptr<wrtlog::Logger::Builder> builder(new wrtlog::GlobalLoggerBuilder());
    builder->buildLoggerName("async_logger");
    builder->buildLoggerLevel(wrtlog::LogLevel::value::WARN);
    builder->buildFormatter("[%c][%f:%l][%p]%m%n");
    builder->buildLoggerType(wrtlog::Logger::Type::LOGGER_ASYNC);
    builder->buildSink<RollByTimeSink>("./logfile/roll-async-by-time",TimeGap::GAP_SECOND);
    wrtlog::Logger::ptr logger=builder->build();
    size_t cur=wrtlog::util::Date::now();
    while(wrtlog::util::Date::now()<cur+5){
        logger->fatal("这是一条测试日志");
        usleep(1000);
    }
    return 0;
}

